package cn.kgc.vue;

import com.qcloud.cos.COSClient;
import com.qcloud.cos.ClientConfig;
import com.qcloud.cos.auth.BasicCOSCredentials;
import com.qcloud.cos.auth.COSCredentials;
import com.qcloud.cos.exception.CosClientException;
import com.qcloud.cos.exception.CosServiceException;
import com.qcloud.cos.model.*;
import com.qcloud.cos.region.Region;

import java.io.File;
import java.util.List;

public class Cos {


    public static void main(String[] args) {
// 1 初始化用户身份信息（secretId, secretKey）。
        String secretId = "AKIDyqkgir0EXzJa1XBqZN6mSyMgxGSbgyLp";
        String secretKey = "gIuaF7sYC39MdzCTh8ihnt6SqTE6CGPd";
        COSCredentials cred = new BasicCOSCredentials(secretId, secretKey);
// 2 设置 bucket 的区域, COS 地域的简称请参照 https://cloud.tencent.com/document/product/436/6224
// clientConfig 中包含了设置 region, https(默认 http), 超时, 代理等 set 方法, 使用可参见源码或者常见问题 Java SDK 部分。
        Region region = new Region("ap-nanjing");
        ClientConfig clientConfig = new ClientConfig(region);
// 3 生成 cos 客户端。
        COSClient cosClient = new COSClient(cred, clientConfig);

//        查询存储桶列表
        getbucket(cosClient);

//        上传文件到桶容器
        upload(cosClient);

//        查询存储桶中内容
        getContent(cosClient);

//        下载文件
        downFile(cosClient);

//        删除文件
        deleteFile(cosClient);

//         创建桶容器
        creatBucket(cosClient);

//        关闭客户端(关闭后台线程)
        cosClient.shutdown();
    }

    /**
     * 创建存储桶（需要改3处）
     * @return
     */
    private static void creatBucket(COSClient cosClient) {
        String bucket = "zh-xtr-1321620467";
        CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucket);
// 设置 bucket 的权限为 PublicRead(公有读私有写), 其他可选有私有读写, 公有读写
        createBucketRequest.setCannedAcl(CannedAccessControlList.Private);
        try {
            Bucket bucketResult = cosClient.createBucket(createBucketRequest);
        } catch (CosServiceException serverException) {
            serverException.printStackTrace();
        } catch (CosClientException clientException) {
            clientException.printStackTrace();
        }
    }

    /**
     * 删除文件（需要改2处位置）
     * @param cosClient
     */
    private static void deleteFile(COSClient cosClient) {
        try {
            // 指定对象所在的存储桶(需要改1）
            String bucketName = "start-1300415347";
            // 指定对象在 COS 上的对象键（需要改2）
            String key = "exampl";
            cosClient.deleteObject(bucketName, key);
        } catch (CosServiceException serverException) {
            serverException.printStackTrace();
        } catch (CosClientException clientException) {
            clientException.printStackTrace();
        }
    }

    /**
     * 下载文件（需要改3处位置）
     *
     * @param cosClient
     */
    private static void downFile(COSClient cosClient) {
        try {
            // 指定对象所在的存储桶（需要改1）
            String bucketName = "start-1300415347";
            // 指定对象在 COS 上的对象键（需要改2）
            String key = "exampl";
            // 指定要下载到的本地路径（需要制定文件名）(需要改3）
            File downFile = new File("D:\\12.pdf");
            GetObjectRequest getObjectRequest = new GetObjectRequest(bucketName, key);
            ObjectMetadata downObjectMeta = cosClient.getObject(getObjectRequest, downFile);
        } catch (CosServiceException serverException) {
            serverException.printStackTrace();
        } catch (CosClientException clientException) {
            clientException.printStackTrace();
        }
    }

    /**
     * 查询存储桶中内容（需要改1处位置）
     *
     * @param cosClient
     */
    private static void getContent(COSClient cosClient) {
        try {
//            桶容器的名称（需要改1）
            String bucket = "start-1300415347";
            ListObjectsRequest listObjectsRequest = new ListObjectsRequest();
            // 设置 bucket 名称
            listObjectsRequest.setBucketName(bucket);
            // prefix 表示列出的 object 的 key 以 prefix 开始
            listObjectsRequest.setPrefix("");
            // 设置最大遍历出多少个对象, 一次 listobject 最大支持1000
            listObjectsRequest.setMaxKeys(1000);
            listObjectsRequest.setDelimiter("/");
            ObjectListing objectListing = cosClient.listObjects(listObjectsRequest);
            for (COSObjectSummary cosObjectSummary : objectListing.getObjectSummaries()) {
                // 对象的路径 key
                String key = cosObjectSummary.getKey();
                // 对象的 etag
                String etag = cosObjectSummary.getETag();
                // 对象的长度
                long fileSize = cosObjectSummary.getSize();
                // 对象的存储类型
                String storageClass = cosObjectSummary.getStorageClass();
                System.out.println("key:" + key + "; etag:" + etag + "; fileSize:" + fileSize + "; storageClass:" + storageClass);
            }
        } catch (CosServiceException serverException) {
            serverException.printStackTrace();
        } catch (CosClientException clientException) {
            clientException.printStackTrace();
        }
    }

    /**
     * 上传文件到桶容器（需要改3处位置）
     *
     * @param cosClient
     */
    private static void upload(COSClient cosClient) {
        try {
            // 指定要上传的文件（需要改1）
            File localFile = new File("D:\\11.pdf");
            // 指定要上传到的存储桶（需要改2）
            String bucketName = "start-1300415347";
            // 指定要上传到 COS 上对象键（需要改3）
            String key = "exampl";
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, key, localFile);
            PutObjectResult putObjectResult = cosClient.putObject(putObjectRequest);
        } catch (CosServiceException serverException) {
            serverException.printStackTrace();
        } catch (CosClientException clientException) {
            clientException.printStackTrace();
        }
    }

    /**
     * 查询存储桶列表（根据用户信息进行）
     *
     * @param cosClient
     */
    private static void getbucket(COSClient cosClient) {
        try {
            List<Bucket> buckets = cosClient.listBuckets();
            System.out.println(buckets);
        } catch (CosServiceException serverException) {
            serverException.printStackTrace();
        } catch (CosClientException clientException) {
            clientException.printStackTrace();
        }
    }
}

